﻿using Model.DbContext;
using Model.Sys;
using Txy.IDal.Core;

namespace IDal
{
    /// <summary>
    /// IDbSession来操作数据，更加方便,利于数据的批量处理,数据提交的权利，由数据访问层提到了业务逻辑层
    /// CurrentDbContext:
	/// EF的DbContext查询时会缓存（默认行为），为了减少脏数据，可使用AsNoTracking() 无缓存查询。框架没有采用AsNoTracking() ，因为低并发下某种程度上提高了性能。
    /// 如果并发高，在需要的地方，使用CurrentDbContext对象来进行AsNoTracking() 无缓存查询,减少脏数据的几率。(并不能减少脏数据，之前说法错误2020/2/25)
    /// BaseDalExtend:
    /// 提供多表查询的基础方法
    /// ***Dal:
    /// 提供单表CRUD的基础方法
    /// SaveChanges:
    /// 执行EF的事务单元
	///
	/// ****************************************************重要理解*******************************************************************************
	/// Dal层的职能被重新定义：只拥有数据操作（CRUD）的执行权利，只负责来执行sql，linq，IDbSession是个封装版EF操作对象。
	/// 也就是说Dal层舍弃了拼接sql，linq的职能（常规的Dal层，都是把sql写在Dal层内），把此项职能交给了BLL层。
	/// 你在Bll层内除了写好业务逻辑控制外，只需要考虑拼接好sql、linq(本质也是扩展方法)，或是写好扩展方法即可，调用的时候，实际上Dal层在帮你调用执行。
	/// 项目是一个两层架构，UI=》Bll，Dal层看做是一个稳定的封装版的EF操作对象即可，那么你只要维护好你的Bll层就可以了。
    /// *******************************************************************************************************************************************
	///
    /// </summary>
	public partial interface IDalSession : IDependency
    {
		/// <summary>
        /// 当前请求周期内的DbContext
        /// </summary>
		ModelContainer CurrentDbContext { get; set; }
		/// <summary>
        /// Dal扩展，适用多表查询
        /// </summary>
		IBaseDalExtend BaseDalExtend { get; set; }
		/// <summary>
        /// 及时的的DbContext，用于异步编程的数据访问（这里使用savechage时，要调用TimelyDbContext的，不通过spring.net注入）
        /// </summary>
		ModelContainer TimelyDbContext { get; }

		IUserInfoDal UserInfoDal{ get; set;}
		IRoleDal RoleDal{ get; set;}
		IPowerDal PowerDal{ get; set;}
		IDepartmentDal DepartmentDal{ get; set;}
		IDataDictionaryHeadDal DataDictionaryHeadDal{ get; set;}
		IDataDictionaryItemDal DataDictionaryItemDal{ get; set;}
		ILoginoutDal LoginoutDal{ get; set;}
		ITreeDataHeadDal TreeDataHeadDal{ get; set;}
		ITreeDataItemDal TreeDataItemDal{ get; set;}
		ITestDal TestDal{ get; set;}
 
		/// <summary>
        /// 执行事务单元
        /// </summary>
		int SaveChanges();
    }
}